package MuliLargeNumber;
/**
 * 姓名：薛继光
 * 班级：软工1101班
 * 学号：1108010127
 * 时间：2013/9/17
 * 类说明：这是一个计算大数相乘的类
 * 方法步骤：
 * 大数乘法的算法有许多种，如转换为二进制，列表法等。
 * 本程序使用列表法，其简单步骤如下：
 * 1.在数组a，b中存入两个大整数，列表：
 *      0  1  2  3          0  1  2
 *     ------------        ----------
 *      8  7  6  5          2  3  4
 * 2.则8765*234为：
 *       0   1   2   3     *
 *      16   14  12  10    0
 *      24   21  18  15    1
 *      32   28  24  20    2
 * 3.将行列相加数相等的分为一组，求和：
 *   0    1   2   3   4   5
 *   16  38  65  56  49  20                
 *4.从最右开始保留个位，其余位加到前一个数上，以此类推，得到结果2051010      
 *5.输出结果
 */
public class MuliLargeNumber {
	public static void main(String args[]){
		int[] a = {8,7,6,5};//乘数a
		int[] b = {2,3,4};//乘数b
		int[] c = new int[a.length + b.length];//结果值
		
		int k = 0,i = 0,j = 0;//标志点k,i,j
		
		for(i = 0;i < a.length;i++){//循环到左起有意义位置
			if(0 != a[i]){
				k = i;
				break;
			}
		}
		
		for(i = k;i < a.length;i++){//输出乘数a
			System.out.printf("%d",a[i]);
		}
		System.out.printf("\n乘以:\n");
		
		for(i = 0;i < b.length;i++){//循环到左起有意义位置
			if(0 != b[i]){
				k = i;
				break;
			}
		}
		
		for(i = k;i < b.length;i++){//输出乘数b
			System.out.printf("%d",b[i]);
		}
		System.out.printf("\n等于:\n");
		//行列相加后得个数为a.length + b.length-1
		for(i = 0;i < a.length;i++){//将行列相等的数求和存入c中，i+j+1将所有数向后移一位，从c[1]开始
			for(j = 0;j < b.length;j++){
				c[i + j + 1] = c[i + j + 1] + (a[i] * b[j]);
			}
		}
		
		for(i = c.length - 1;i >=0;i--){//取余的个位数，除以10的进位数
			if(c[i] >= 10){
				c[i - 1] = c[i - 1] + c[i]/10;
				c[i] = c[i]%10;
			}
		}
		
		for(i = 0;i < c.length;i++){//循环到左起有意义位置
			if(0 != c[i]){
				k = i;
				break;
			}
		}
		
		for(i = k;i < c.length;i++){//输出结果
			System.out.printf("%d",c[i]);
		}
	}

}
